#include "mainwindow.h"
#include "ui_mainwindow.h"

#include "qevent.h"
#include <QGridLayout>
#include <QLabel>
#include <QLineEdit>
#include <QApplication>
#include <QTimer>
#include <QMutex>
#include <QScreen>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //1.窗口标题及大小设置
    this -> setFixedSize (500 ,250);
    this -> setWindowTitle("ColorRecognizer");

    //第一个参数 QSizePolicy::Preferred 表示该控件在水平（宽度）方向上希望获得其首选大小。
    //第二个参数 QSizePolicy::Expanding 表示该控件在垂直（高度）方向上可以扩展。
    QSizePolicy sizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding);
    //这一行设置了 sizePolicy 的属性，使得控件的高度依赖于其宽度
    sizePolicy.setHeightForWidth(ui->labColor->sizePolicy().hasHeightForWidth());
    ui->labColor->setSizePolicy(sizePolicy);
    ui->verticalLayout->addWidget(ui->labColor);



    // //当前颜色标签
    ui->label->setMinimumSize(QSize(0, 25));
    ui->label->setStyleSheet("background-color: rgba(0, 0, 0, 0.8); color: rgb(200, 200, 200); border-radius: 5px; padding: 5px;");
    ui->verticalLayout->addWidget(ui->label);

    //剪贴板与定时器初始化
    //获取剪贴板实例，并创建定时器以每100毫秒调用一次 showColorValue() 槽函数，这个槽函数可能用于更新颜色值或处理其他相关操作。
    cp = QApplication :: clipboard ();
    m_pressed = false;

    timer = new QTimer (this );
    timer -> setInterval (100 );
    connect(timer,SIGNAL(timeout()), this,SLOT(showColorValue()));
    timer -> start ();
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::mousePressEvent(QMouseEvent *e)
{
    if (ui->labColor->rect().contains(e->pos())) {
        m_pressed = true;
    }
}

void MainWindow::mouseReleaseEvent(QMouseEvent *)
{
    m_pressed = false;
}

void MainWindow::showColorValue()
{
    //1. 检查鼠标是否按下
    if (!m_pressed) {
        return;
    }

    //获取光标位置,使用 QCursor::pos() 方法获取当前光标的 X 和 Y 坐标，并将其显示在文本框 txtPoint 中。
    int x = QCursor::pos().x();
    int y = QCursor::pos().y();
    ui->txtPoint->setText(tr("x:%1  y:%2").arg(x).arg(y));


    // 使用 grabWindow() 方法从主屏幕中抓取当前光标位置附近的一个小区域（宽高均为2像素）。
    QScreen *screen = qApp->primaryScreen();
    QPixmap pixmap = screen->grabWindow(0, x, y, 2, 2);

    //检查截取结果是否有效,如果捕获到的图像为空，则退出函数
    if (pixmap.isNull()) {
        return;
    }

    //获取颜色值
    //将 QPixmap 转换为 QImage，并检查该图像是否有效。
    //从图像中获取左上角（坐标 (0,0)）的颜色值，并提取红色、绿色和蓝色分量。
    int red, green, blue;
    QString strDecimalValue, strHex;

    QImage image = pixmap.toImage();
    if (image.valid(0, 0)) {
        QColor color = image.pixel(0, 0);
        red = color.red();
        green = color.green();
        blue = color.blue();

        //格式化颜色值字符串
        //将 RGB 值格式化为十六进制字符串和十进制字符串，以便在界面上显示。
        //十六进制表示使用大写字母格式化。
        QString strRed = tr("%1").arg(red & 0xFF, 2, 16, QChar('0'));
        QString strGreen = tr("%1").arg(green & 0xFF, 2, 16, QChar('0'));
        QString strBlue = tr("%1").arg(blue & 0xFF, 2, 16, QChar('0'));

        //自动计算前景色以提高可读性
        //根据 RGB 值计算灰度值，以判断背景色的亮度。如果亮度较高，则选择黑色作为前景色，否则选择白色，以确保文字在不同背景下都能清晰可见。
        strDecimalValue = tr("%1, %2, %3").arg(red).arg(green).arg(blue);
        strHex = tr("#%1%2%3").arg(strRed.toUpper()).arg(strGreen.toUpper()).arg(strBlue.toUpper());
    }

    //根据背景色自动计算合适的前景色
    QColor color(red, green, blue);
    double gray = (0.299 * color.red() + 0.587 * color.green() + 0.114 * color.blue()) / 255;
    QColor textColor = gray > 0.5 ? Qt::black : Qt::white;

    //更新界面元素样式和文本内容
    //设置标签 labColor 的样式表，使其背景颜色与所选颜色一致，同时设置字体颜色。
    //更新 RGB 和 Web 色码输入框中的文本，以反映当前选定的颜色信息。
    QString str = tr("background:rgb(%1);color:%2").arg(strDecimalValue).arg(textColor.name());
    ui->labColor->setStyleSheet(str);
    ui->txtRgb->setText(strDecimalValue);
    ui->txtWeb->setText(strHex);
}
